package trabalho;

import javax.swing.JOptionPane;

public class Menu {

	private ListaDupla listaDupla;
	
	public static final String MENU_PRINCIPAL = "1- Inserir Elemento no início "
											+ "\n2- Inserir Elemento na posição i " 
											+ "\n3- Excluir elemento da posição i"
											+ "\n4- Quantidade de elementos " 
											+ "\n5- Limpar lista"
											+ "\n6- Retornar elemento da posição nó local" 
											+ "\n7- Retornar elemento da posição i" 
											+ "\n0- Sair";
	

	public Menu() {
		this.listaDupla = new ListaDupla();
	}

	public void menu() {

		int opcao = -1;

		while (opcao != 0) {

			try {

				opcao = Integer.parseInt(JOptionPane.showInputDialog(MENU_PRINCIPAL));

				switch (opcao) {

				case 1:
					inserirPessoaNoInicio();
					break;

				case 2:
					inserirPessoaNaPosicao();
					break;

				case 3:
					excluirElementoDaPosicao();
					break;

				case 4:
					quantidadeDeElementos();
					break;
					
				case 5:
					limparLista();
					break;
					
				case 6:
					retornarElementoNoLocal();
					break;
					
				case 7:
					retornarElementoDaPosicao();
					break;	

				case 0:
					System.exit(0);
				default:
					throw new Exception();
				}
			} catch (Exception e) {
				msgOpcaoInvalida();
				opcao = -1;
			}
		}
	}

	public void inserirPessoaNoInicio() {
		No elemento = new No();
		Pessoa pessoa = new Pessoa();
		pessoa.inserirDados();
		elemento.setPessoa(pessoa);
		listaDupla.inserirElemento(elemento);
	}
	
	public void inserirPessoaNaPosicao(){
		
		if(listaDupla.getTamanhoLista() == 0){
			inserirPessoaNaPosicao();
		}
		else{
			No elemento = new No();
			Pessoa pessoa = new Pessoa();
			pessoa.inserirDados();
			elemento.setPessoa(pessoa);
			
			int posicao = Integer.parseInt(JOptionPane.showInputDialog("Informe a posição"));
			
			if(posicao < 0)
				JOptionPane.showMessageDialog(null, "O elemento não foi inserido. Posição inválida!", "Erro:.", JOptionPane.ERROR_MESSAGE);
			else
				listaDupla.inserirElemento(elemento, posicao);
		}
	}

	public void excluirElementoDaPosicao(){
		if(listaDupla.getTamanhoLista() < 1){
			msgListaVazia();
		}
		else{
			
			int posicao = Integer.parseInt(JOptionPane.showInputDialog("Informe a posição"));
			
			if(posicao > listaDupla.getTamanhoLista() && posicao > 1)
				JOptionPane.showMessageDialog(null, "Posição inválida!", "Erro:.", JOptionPane.ERROR_MESSAGE);
			else{
				listaDupla.excluirElemento(posicao);
				JOptionPane.showMessageDialog(null, "Elemento excluído!");
			}
		}
	}

	public void quantidadeDeElementos(){
		if(listaDupla.getTamanhoLista() < 1)
			msgListaVazia();
		else
			JOptionPane.showMessageDialog(null, "A lista contém " + listaDupla.getTamanhoLista() + " elemento(s)!");
	}

	public void retornarElementoNoLocal() {
		if(listaDupla.getTamanhoLista() < 1)
			msgListaVazia();
		else
			JOptionPane.showMessageDialog(null, "Nó local: \n" + listaDupla.getPonteiro());
	}
	
	public void retornarElementoDaPosicao() {
		
		if(listaDupla.getTamanhoLista() == 0){
			msgListaVazia();
		}
		else{
			int posicao = Integer.parseInt(JOptionPane.showInputDialog("Informe a posição"));
			
			if(posicao > listaDupla.getTamanhoLista() || posicao < 1){
				JOptionPane.showMessageDialog(null, "A posição deve ser maior que 0 e menor do que o tamanho da lista " +
												  "\nA lista tem " + listaDupla.getTamanhoLista() + " elemento(s)",
												  "Atenção:.",  JOptionPane.WARNING_MESSAGE);
			}
			else{
				JOptionPane.showMessageDialog(null, listaDupla.retornarElementoDaPosicao(posicao));
			}
		}
	}
	
	public void limparLista(){
		if(listaDupla.getTamanhoLista() < 1)
			msgListaVazia();
		else
			listaDupla.excluirTodosElementos();
	}

	public void msgListaVazia() {
		JOptionPane.showMessageDialog(null, "A lista está vazia!", "Atenção", JOptionPane.WARNING_MESSAGE);
	}

	public void msgOpcaoInvalida() {
		JOptionPane.showMessageDialog(null, "Opção inválida", "Erro:.", JOptionPane.ERROR_MESSAGE);
	}

	public ListaDupla getListaDupla() {
		return listaDupla;
	}

	public void setListaDupla(ListaDupla listaDupla) {
		this.listaDupla = listaDupla;
	}

	
}	